home *** CD-ROM | disk | FTP | other *** search
- PAGE 55,132
- TITLE QuadScreen INSTALL - Copyright 1983 Mathews Associates
-
-
- SCRSEG EQU 0D000H ; HARDWARE SEGMENT FOR SCREEN
- ;
- ;
- VECTORS SEGMENT AT 0
-
- ORG 2*4
- INT2IP DW ? ; Parity error / QuadScreen retrace interrupt
- INT2CS DW ? ; vector - IP and CS
-
- ORG 9*4
- INT9IP DW ? ; Keyboard interrupt
- INT9CS DW ?
-
- ORG 16*4
- INT16IP DW ? ; Video I/O IP and CS
- INT16CS DW ?
-
- VECTORS ENDS
-
-
- DATA SEGMENT AT 00040H
-
- ORG 017H
- B17 DB ?
- B18 DB ?
-
- DATA ENDS
-
-
- QS SEGMENT PUBLIC 'QS'
-
- PUBLIC PLAST
-
- EXTRN ALTINT:FAR,LAST:NEAR,RETRACE:NEAR
- EXTRN OI16IP:WORD,OI16CS:WORD,HDWADR:WORD
-
-
- ASSUME CS:QS,DS:QS
-
- ORG 0100H
-
- INSTALL PROC NEAR
- XOR AX,AX ; Setup retrace vector
- MOV ES,AX
-
- ASSUME ES:VECTORS
-
- ; Get current Video I/O vector:
- MOV AX,INT16IP
- MOV OI16IP,AX
- MOV AX,INT16CS
- MOV OI16CS,AX
- ; Check if it is to SYSROM segment:
- CMP AX,0F000H
- JZ INST01 ; Yes, O.K.
- ; Print message & exit:
- MOV DX,OFFSET MSG01
- MOV AH,9
- INT 21H ; Print message
- INT 20H ; Exit back to DOS
- ;
- INST01:
-
- CLI
-
- MOV AX,INT9IP
- MOV KEYBDIP,AX
- MOV AX,INT9CS
- MOV KEYBDCS,AX
- MOV AX,OFFSET RETRACE
- MOV INT2IP,AX
- MOV AX,OFFSET ALTINT
- MOV INT16IP,AX
- MOV AX,OFFSET KEYINT
- MOV INT9IP,AX
- MOV AX,CS
- MOV INT2CS,AX
- MOV INT16CS,AX
- MOV INT9CS,AX
-
- STI
-
- ASSUME ES:NOTHING
-
- MOV AH,0
- MOV AL,008H
- INT 16
- MOV DX,PLAST
- ADD DX,15
- MOV CL,4
- SHR DX,CL
- MOV AH,031H
- XOR AL,AL
- INT 33
-
- PLAST DW LAST
-
- MSG01: DB 'QuadScreen has already been Installed !',13,10,'$'
-
- INSTALL ENDP
-
- KBD_INT PROC FAR
- KEYINT:
- STI
- PUSH AX
- PUSH DS
- MOV AX,SEG DATA
- MOV DS,AX
-
- ASSUME DS:DATA
-
- ; IF SYSTEM RESET FROM KEYBOARD THEN RESET QUADSCREEN SCAN
- ; REGISTER TO 0, DISABLE QUADSCREEN INTERRUPT AND DISABLE
- ; VIDEO ON QUADSCREEN. (I.E., WRITE 0000H TO HARDWARE REGISTER
- ; AT PORT 220H & 221H.)
- ;
- IN AL,060H
- CMP AL,83 ; CHECK FOR DEL KEY
- JNZ KYI1
- TEST B17,4 ; CHECK FOR CTRL STATE
- JZ KYI1
- TEST B17,8 ; CHECK FOR ALT STATE
- JZ KYI1
- PUSH DX
- XOR AX,AX
- MOV DX,0220H
- OUT DX,AX
- POP DX
- KYI1:
- ; CHECK FOR ALT-PRTSC KEY. IF YES, THEN PROCESS HERE BY GIVING
- ; A BIT-BY-BIT QUADSCREEN DUMP TO PRINTER.
- ;
- CMP AL,55 ; CHECK FOR PRTSC KEY
- JNZ KYI2
- MOV AL,B17
- AND AL,0FH
- CMP AL,8 ; CHECK IF ALT IS ONLY SHIFT STATE
- JNZ KYI2 ; IF NOT, JUMP TO PROCESS IN NORMAL WAY
- PUSH BX ; SAVE ALL REGISTERS
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH ES
- IN AL,061H ; READ CONTROL PORT
- MOV AH,AL ; SAVE VALUE READ
- OR AL,080H ; RESET BIT FOR KBD
- OUT 061H,AL
- XCHG AL,AH ; GET ORIGINAL CONTROL PORT VALUE
- OUT 061H,AL ; KBD HAS BEEN RESET
- CALL QSDUMP ; QUADSCREEN SCREEN DUMP
- CLI ; INTERRUPT RETURN SEQUENCE
- MOV AL,020H
- OUT 020H,AL ; SEND END-OF-INTERRUPT COMMAND
- POP ES
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP DS
- POP AX
- IRET
- ;
- KYI2:
- POP DS
-
- ASSUME DS:NOTHING
-
- POP AX
- JMP DWORD PTR CS:KEYBDIP
-
- KEYBDIP DW ?
- KEYBDCS DW ?
- KBD_INT ENDP
-
- ASSUME CS:QS,DS:QS,ES:QS
- QSDUMP PROC
- MOV AX,CS
- MOV DS,AX ; INITIALIZE DATA & EXTENDED SEGMENTS
- MOV ES,AX ; = CODE SEGMENT
- ;
- QSD10:
- MOV BL,27 ; CHAR SEQUENCE FOR 7/72" LINE SPACING
- CALL PRTCHAR
- MOV BL,49
- CALL PRTCHAR
- ;
- XOR DX,DX ; INITIALIZE ROW NO.
- ;
- QSD20:
- LEA SI,BUF
- XOR CX,CX ; INITIALIZE COLUMN NO.
- PUSH DX ; SAVE INITIAL ROW NO.
- ;
- QSD30:
- XOR BX,BX ; CLEAR BYTE TO BE PRINTED
- ;
- QSD40:
- SHL BL,1
- CALL RD_DOT ; READ A SCREEN DOT
- OR BL,AL ; PUT IT INTO BYTE TO PRINT
- INC DX ; ADVANCE TO NEXT ROW
- MOV AX,DX
- AND AX,7 ; CHECK IF DONE WITH 8 ROWS
- JNZ QSD40
- ;
- MOV [SI],BL ; PUT BL IN PRINT-LINE BUFFER
- INC SI ; ADVANCE TO NEXT SPOT IN BUFFER
- INC CX ; ADVANCE TO NEXT COLUMN
- CMP CX,968 ; SEE IF LAST COLUMN
- JAE QSD50 ; JUMP WHEN FINISHED THE ROW
- POP DX ; RESTORE INITIAL ROW NO.
- PUSH DX
- JMP QSD30 ; GO BACK TO PROCESS 8 ROWS OF NEXT COL
- ;
- QSD50:
- CALL PRT_BUF ; PRINT LINE BUFFER
- POP DX
- ADD DX,8
- CMP DX,511 ; CHECK IF DONE WITH WHOLE SCREEN
- JL QSD20 ; CONTINUE IF NOT DONE
- MOV BL,27 ; RESET TO 1/8" LINE SPACING
- CALL PRTCHAR
- MOV BL,48
- CALL PRTCHAR
- RET ; TERMINATE PROGRAM
- QSDUMP ENDP
- ;
- ;-------------------------------------------------------
- ;
- BUF DB 968 DUP(0) ; PRINT-LINE BUFFER
- BUF_END EQU $ ; END OF BUFFER +1
- PRTSEL EQU 0 ; PRINTER SELECT (CAN BE 0,1 OR 2)
- ;
- ;-------------------------------------------------------
- ;
- ;
- ;
- ;
- ;
- ; PRINT BUFFER
- ;
- PRT_BUF PROC
- PUSH AX ; SAVE REGISTERS
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- ;
- ; QUADSCREEN HAS 968 PIXELS IN ONE DOT ROW BUT THE EPSON MX-80
- ; HAS ONLY 960 PIXELS. THE FOLLOWING LOOP OR'S THE LAST 9 SCREEN
- ; PIXELS IN THE PRINT BUFFER. WHILE THE APPEARANCE OF THIS ON
- ; THE PRINTER MAY BE QUESTIONABLE, THE ATTEMPT IS TO KEEP FROM
- ; LOSING ANY SCREEN INFORMATION.
- ;
- LEA DI,BUF_END
- MOV CX,9 ; CX = LOOP COUNT
- XOR BX,BX ; INITIALIZE COMPOSITE BYTE = 0
- ;
- PB10:
- DEC DI
- OR BL,[DI] ; OR IN NEXT BYTE
- LOOP PB10
- MOV [DI],BL ; PUT COMPOSITE BYTE BACK AS 960th BYTE
- MOV CX,960 ; CX = NO. OF BYTES IN BUFFER TO PRINT
- ; THE FOLLOWING LOOP SCANS THE PRINT-LINE BUFFER FROM END BACK
- ; TO BEGINNING. THE LOOP STOPS AT THE FIRST NON-ZERO BYTE OR AT
- ; THE BEGINNING OF THE BUFFER, WHICHEVER COMES FIRST. THIS IS
- ; TO STREAMLINE THE PRINT SO THAT ONLY THE MINIMUM NO. OF BYTES
- ; ARE SENT TO THE PRINTER FOR EACH PRINT LINE.
- ;
- PB20:
- MOV AL,[DI]
- CMP AL,0
- JNZ PB30
- DEC DI
- LOOP PB20
- ;
- PB30:
- JCXZ PB50 ; IF ALL BYTES WERE 0, DON'T PRINT ANY
- MOV BL,27 ; CHAR SEQUENCE FOR PRINTER
- CALL PRTCHAR ; < DUAL-DENSITY BIT IMAGE MODE >
- MOV BL,76
- CALL PRTCHAR
- MOV BL,CL
- CALL PRTCHAR
- MOV BL,CH
- CALL PRTCHAR
- XOR SI,SI
- ;
- PB40:
- MOV BL,[SI+BUF]
- CALL PRTCHAR
- INC SI
- LOOP PB40
- ;
- PB50:
- MOV BL,10
- CALL PRTCHAR
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- RET
- PRT_BUF ENDP
- ;
- ;
- ;
- ;
- ;
- ; PRINT A CHAR IN BL
- ;
- ;
- ;
- PRTCHAR PROC
- PUSH AX
- PUSH DX
- ;
- PC10:
- XOR AX,AX
- MOV AH,2
- MOV DX,PRTSEL
- INT 23 ; FETCH PRINTER STATUS
- TEST AL,80H ; CHECK IF BUSY
- JNZ PC10 ; LOOP AND WAIT TILL NOT BUSY
- XOR AH,AH
- MOV AL,BL
- INT 23 ; PRINT A CHARACTER
- POP DX
- POP AX
- RET
- PRTCHAR ENDP
- ;
- ;
- ;
- ; READ A SCREEN DOT
- ;
- RD_DOT PROC
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- MOV DI,CX
- MOV BX,CX
- MOV CL,3
- ADD DX,HDWADR
- AND DX,03FFH
- SHL DX,CL
- ADD DX,SCRSEG
- MOV ES,DX
- SHR DI,CL
- AND BX,7
- MOV AH,1
- MOV CL,7
- SUB CL,BL
- SHL AH,CL
- XOR AL,AL
- TEST ES:[DI],AH
- JZ RD10
- INC AL
- ;
- RD10:
- POP SI
- POP DX
- POP CX
- POP BX
- RET
- RD_DOT ENDP
- ;
- ;
- QS ENDS
- ;
- END INSTALL
-